package util;

import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import bean.Cliente;
import bean.CondicionVenta;
import bean.Cotizacion;
import bean.ItemCotizacion;
import bean.ItemOrdenCompra;
import bean.OrdenCompra;
import bean.Proveedor;
import bean.Rodamiento;
import bean.SolicitudCotizacion;

/**
 * Esta clase sirve para escribir archivos XMLs. 
 * @author nicolasmondada
 *
 */
public class XmlWriter 
{
	
	/**
	 * Metodo de ejemplo: recibe un objeto tipo Cotizacion y escribe un xml de cotizacion
	 * @param Cotizacion con los datos a escribir en el XML
	 * @param Path donde se almacena el XML de cotizacion
	 * @return Nothing
	 */
	public void escribirXMLCotizacion(Cotizacion c, String path)
	{
		 try 
		 {
		        //preparo el inicio del artchivo
			 	Element cotizacion  = new Element("Cotizacion");
		        cotizacion.setAttribute(new Attribute("numero", Integer.toString( c.getNumero() ) ) );
		        Document doc = new Document(cotizacion);
		        doc.setRootElement(cotizacion);
		 
		        //item <Vigencia>
		        Element vigencia = new Element("Vigencia");
		        //<Fecha>
		        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		        String fechaRecepcion = df.format(c.getFechaRecepcion());
		        vigencia.addContent(new Element("Fecha").setText(fechaRecepcion));
		        //<Termino>
		        int termino = this.calculateDifference(c.getFechaExpiracion(), c.getFechaRecepcion());
		        vigencia.addContent(new Element("lastname").setText(Integer.toString(termino)));
		        doc.getRootElement().addContent(vigencia);
		 
		        //item <Cliente>
		        Cliente cl = c.getCliente(); 
		        Element cliente = new Element("Cliente");
		        //<Cuil>
		        cliente.addContent(new Element("Cuil").setText(cl.getCuit()));
		        //<RazonSocial>
		        cliente.addContent(new Element("RazonSocial").setText(cl.getRazonSocial()));
		        doc.getRootElement().addContent(cliente);
		 
		        //<CondicionesDeVenta>
		        List<CondicionVenta> lcv = c.getCondicionesDeVenta();
		        Element condicionesDeVenta = new Element("CondicionesDeVenta");
		        
		        for( int i = 0; i <= lcv.size(); i++)
		        {
		        	CondicionVenta cv = lcv.get(i);
		        	if(cv.getDiasFinanciacion() != 0)
		        	{
		        		//la condicion de venta es financiada.
		        		Element financiacion = new Element("Financiacion");
		 		        financiacion.addContent(new Element("CantidadDias").setText( Integer.toString(cv.getDiasFinanciacion()) ) );
		 		        financiacion.addContent(new Element("Recargo").setText( Float.toString(cv.getRecargo() ) ) );
		 		        condicionesDeVenta.addContent(financiacion);
		        	}
		        	else
		        	{
		        		//la condicion de venta es "contado".
		        		Element pagoContado = new Element("PagoContado");
		 		        pagoContado.addContent(new Element("Descuento").setText(Float.toString(cv.getDescuento() ) ) );
		 		        condicionesDeVenta.addContent(pagoContado);
		        	}	
		        }
		        doc.getRootElement().addContent(condicionesDeVenta);
		        
		        //<Referencia>
		        Element referencia = new Element("Referencia");
		        SolicitudCotizacion solicitudCotizacion = c.getSolCot();
		        
		        //<SolicitudCotizacion>
		        Element solCot = new Element("SolicitudCotizacion");
		        solCot.addContent(new Element("Numero").setText(Integer.toString(solicitudCotizacion.getNumero() ) ) );
		       
		        String fechaSolCot = df.format(solicitudCotizacion.getFechaSolicitud()); //Date Formateado dd/MM/yyyy
		        solCot.addContent(new Element("Fecha").setText(fechaSolCot));
		        
		        referencia.addContent(solCot);
		        
		        //<Rodamientos>
		        Element rodamientos = new Element("Rodamientos");
		        List<ItemCotizacion> items = c.getItems();
		        
		        for( int i = 0; i <= items.size(); i++ )
		        {
		        	ItemCotizacion item = items.get(i);
		        	Rodamiento rod = item.getRodamiento();
		        	
		        	Element rodItem = new Element("Item");
		        	rodItem.addContent(new Element("Sufijo").setText(rod.getCodigoSkf()));
		        	rodItem.addContent(new Element("Marca").setText(rod.getMarca()));
		        	rodItem.addContent(new Element("Origen").setText(rod.getOrigen()));
		        	rodItem.addContent(new Element("Precio").setText(Float.toString(item.getPrecioCotizacion() ) ) );
		        	rodItem.addContent(new Element("Cantidad").setText(Integer.toString(item.getCantidad() ) ) );
		        	rodamientos.addContent(rodItem);
		        }
		        referencia.addContent(rodamientos);
		        doc.getRootElement().addContent(referencia);
		        
		        //preparo el outPut del XML
		        // new XMLOutputter().output(doc, System.out);
		        XMLOutputter xmlOutput = new XMLOutputter();
		 
		        //formateo el XML
		        xmlOutput.setFormat(Format.getPrettyFormat());
		        //escribo el archivo XML en el path seleccionado.
		        xmlOutput.output(doc, new FileWriter(path + "cotizacion_"+ c.getNumero() + ".xml"));
		 
		        System.out.println("Archivo de cotizacion generado: cotizaicon_" + c.getNumero() + ".xml");
		 } 
		 catch (IOException io) 
		 {
			 System.out.println(io.getMessage());
		 }
	}
	
	public void escribirXMLOrdenDeCompra( OrdenCompra oc, String path )
	{
		try
		{
			//preparo el inicio del archivo
		 	Element ordenCompra  = new Element("OrdenCompra");
	        ordenCompra.setAttribute(new Attribute("numero", Integer.toString( oc.getNumero() ) ) );
	        Document doc = new Document(ordenCompra);
	        doc.setRootElement(ordenCompra);
	        
	        //item <Emision>
	        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
	        String fechaEmision = df.format(oc.getFechaEmision());
	        doc.getRootElement().addContent( new Element("Emision").setText(fechaEmision));
	     
	        //item <Cliente> (proveedor)
	        Proveedor prov = oc.getProveedor();
	        Element cliente = new Element("Cliente");
	        //<Cuil>
	        cliente.addContent(new Element("Cuil").setText(prov.getCUIT()));
	        //<RazonSocial>
	        cliente.addContent(new Element("RazonSocial").setText(prov.getRazonSocial()));
	        doc.getRootElement().addContent(cliente);
	       
	        //<Rodamientos>
	        Element rodamientos = new Element("Rodamientos");
	        List<ItemOrdenCompra> items = oc.getItems();
	        
	        for( int i = 0; i <= items.size(); i++ )
	        {
	        	ItemOrdenCompra item = items.get(i);
	        	Rodamiento rod = item.getRodamiento();
	        	
	        	Element rodItem = new Element("Item");
	        	rodItem.addContent(new Element("Sufijo").setText(rod.getCodigoSkf()));
	        	rodItem.addContent(new Element("Marca").setText(rod.getMarca()));
	        	rodItem.addContent(new Element("Origen").setText(rod.getOrigen()));
	        	rodItem.addContent(new Element("Cantidad").setText(Integer.toString(item.getCantidad() ) ) );
	        	rodamientos.addContent(rodItem);
	        }
	        doc.getRootElement().addContent(rodamientos);
	        
	        //preparo el outPut del XML
	        // new XMLOutputter().output(doc, System.out);
	        XMLOutputter xmlOutput = new XMLOutputter();
	 
	        //formateo el XML
	        xmlOutput.setFormat(Format.getPrettyFormat());
	        //escribo el archivo XML en el path seleccionado.
	        xmlOutput.output(doc, new FileWriter(path + "ordenCompra_"+ oc.getNumero() + ".xml"));
	 
	        System.out.println("Archivo de cotizacion generado: ordenCompra_" + oc.getNumero() + ".xml");
		}
		catch (IOException io) 
		{
			 System.out.println(io.getMessage());
		}    
	}
	
	/**
	 * Metodo que sive para calcular la diferencia en dias entre 2 Dates
	 * @param Date a Fecha 1 a comparar.
	 * @param Date b Fecha 2 a comparar .
	 * @return int Diferencia en dias.
	 */
	private int calculateDifference(Date a, Date b)
	{
	    int tempDifference = 0;
	    int difference = 0;
	    Calendar earlier = Calendar.getInstance();
	    Calendar later = Calendar.getInstance();

	    if (a.compareTo(b) < 0)
	    {
	        earlier.setTime(a);
	        later.setTime(b);
	    }
	    else
	    {
	        earlier.setTime(b);
	        later.setTime(a);
	    }

	    while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR))
	    {
	        tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
	        difference += tempDifference;

	        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
	    }

	    if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR))
	    {
	        tempDifference = later.get(Calendar.DAY_OF_YEAR) - earlier.get(Calendar.DAY_OF_YEAR);
	        difference += tempDifference;

	        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
	    }

	    return difference;
	}


}
